/**
 * @file VersionnageALaGNU.h
 * @author Pierre Le Bodic
 * @date mardi 13 décembre
 */

#include <vector>
#include <string>
#include <sstream>
#include <boost/regex.hpp>
#include "SystemeDeVersionnage.h"

#ifndef _VERSIONNAGE_A_LA_GNU_H_
#define _VERSIONNAGE_A_LA_GNU_H_

namespace gestionnaireDeVersions {

/**
 * Cette classe modélise le versionnage à la manière de ce que fait GNU,
 * c'est à dire majeur.mineur.revision (ex 1.11.5). Elle implémente le
 * "design pattern" singleton.
 */
class VersionnageALaGNU : public SystemeDeVersionnage{
   private:
      ///L'unique instance
      static VersionnageALaGNU instance;
      /**
       * Expression régulière correspondant à une notation
       * majeur.mineur.revision, où majeur, mineur et revision sont des
       * nombres entiers positifis.
       */
      boost::regex expressionALaGNU;
      
      /**
       * Constructeur privé
       */
      VersionnageALaGNU();
      
      /**
       * Constructeur par copie privé (à ne pas implémenter)
       */
      VersionnageALaGNU(VersionnageALaGNU const&);
      
      /**
       * Constructeur par affectation privé (à ne pas implémenter)
       */
      void operator=(VersionnageALaGNU const&);
   
   public:
      
      /**
       * Méthode qui crée si besoin et retourne l'instance singleton.
       */
      static SystemeDeVersionnage& getInstance();
      //Via SystemeDeVersionnage
      virtual bool estValide(const string version) const;
      //Via SystemeDeVersionnage
      virtual int compare(const string s1, const string s2) const throw(ExceptionDeVersion);
};

}//namespace


#endif // _VERSIONNAGE_A_LA_GNU_H_
